【初心者向け】Elastic StackのElasticsearchを触ってみよう
【初心者向け】Elastic Stackについて知ろうで紹介したElastic StackのコアプロダクトであるElasticsearch(Amazon Elasticsearch Service)の立ち上げ、サンプルデータ登録、検索等を行ってみたいと思います。
※本記事は、あくまでElasticsearchに触ったことがないという方向けに紹介する記事のため、仕様等の説明はある程度省いています。
Elasticsearch, データの準備
まずは、Elasticsearchドメインの作成、サンプルデータの登録を行います。
ドメインの立ち上げ
簡単にAWSコンソールを用いて、Amazon Elasticsearch Serviceで新規のElasticsearchを立ち上げる手順を説明します。
今回は検証用のためインスタンスタイプやセキュリティについては最小限の設定となっていることに注意してください。
AWSコンソールからElasticsearch Serviceを選択して、「新しいドメインの作成」を選択します。
Step 1:デプロイタイプの選択
- デプロイタイプを「開発およびテスト」を選択して「次へ」を押下します。
Step 2:ドメインの設定
- 任意のElasticsearchドメイン名を入力します。
- インスタンスタイプに
t3.small.elasticsearch
を選択して「次へ」を押下します。
Step 3:アクセスとセキュリティの設定
- ネットワーク構成で「パブリックアクセス」に設定します。
- 「細かいアクセスコントロールを有効化」のチェックを外します。
- カスタムアクセスポリシーに自身のIPアドレスを許可する設定を行い、「次へ」を押下します。
Step 4:確認
設定内容が問題ないことを確認して、「確認」を押下します。
ドメインの起動
作成したドメインの起動が行われるので15分程度待機します。
以下のような情報が表示されればElasticsearchの立ち上げが完了して、アクセス可能になります。
この情報の中で重要なのは、「エンドポイント」に書かれているElasticsearchのREST APIのエンドポイントと「Kibana」に書かれているKibanaへのURLです。
サンプルデータの登録
先ほど確認したKibanaへのURLをブラウザで初めて開くと、サンプルデータを登録するか問われるのでSample eCommerce orders
, Sample flight data
, Sample web logs
をそれぞれ登録しましょう。
このサンプルデータは、ドキュメントだけでなく後述するDashboardまで付随するのでとても参考になります。
REST APIを叩いてみる
データの登録が行えたので実際にREST APIを叩いてみます。 REST APIsで一覧になっているように、様々な機能がAPIとして提供されています。 今回は、CAT APIsとSearch APIsの中から簡単なものを紹介します。
CAT APIs
Elasticsearchは基本的にJSONのレスポンスを返します。プログラム等からは操作しやすいですが人間が目でみて理解しやすいとは言えません。
そこで、人間にも理解しやすい形式のレスポンスを返すCAT APIsが存在します。
まずは、ヘルスチェックを行ってみましょう。cat health APIで確認してみます。
$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/_cat/health?v" epoch timestamp cluster status node.total node.data discovered_master shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 1606686770 21:52:50 0000000000:cm-yokoyama-test green 1 1 true 4 4 0 0 0 0 - 100.0%
ElasticsearchのClusterのstatusはgreen
のため問題なく動作しているようです。
Elasticsearchは分散型エンジンのためクラスタやノードという概念が存在します。実際に運用するとなると複数ノードで1つのクラスタとなるように動作させるため各ノードの情報についても確認したくなります。cat nodes APIで確認してみます。
$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/_cat/nodes?v" ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name x.x.x.x 48 88 3 0.00 0.00 0.00 dimr * 7d9c2bf81f04e64ac6323213484ceb78
起動しているノードの情報が簡単なリソース情報と共に確認できました。(今回は検証のため1ノード構成)
次に、先ほどKibanaのUIから登録したサンプルデータが正しく登録されているかインデックス一覧をcat indices APIで確認してみます。
$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/_cat/indices?v" health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open kibana_sample_data_ecommerce hF3A0CB3T8SxxuATXo_ebQ 1 0 4675 0 4.2mb 4.2mb green open kibana_sample_data_logs RF6suhpeQEaGCUr2lhrTdQ 1 0 14074 0 11.6mb 11.6mb green open kibana_sample_data_flights EgiYk54mTrmRNZly2HnomA 1 0 13059 0 6.3mb 6.3mb green open .kibana_1 tPOvos6KTsClXhxwFVVpwA 1 0 155 5 150.4kb 150.4kb
下記のインデックスが登録されていることが確認できました。.kibana_1
というインデックスは登録した覚えはありませんが、Kibana自体の内部設定インデックスなので気にしなくてよいです。
kibana_sample_data_ecommerce
kibana_sample_data_logs
kibana_sample_data_flights
.kibana_1
Search APIs
ではSearch APIsを用いて実際に登録したサンプルデータkibana_sample_data_logs
に対して簡単な検索を行ってみましょう。
まずは条件を全く指定しないで検索してみます。返却されるドキュメントの数は指定していないためデフォルトで10件となります。
$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/kibana_sample_data_logs/_search?pretty" { "took" : 5, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 10000, "relation" : "gte" }, "max_score" : 1.0, "hits" : [ { "_index" : "kibana_sample_data_logs", "_type" : "_doc", "_id" : "9_huFXYBlzqvYqwIWQNp", "_score" : 1.0, "_source" : { "agent" : "Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1", "bytes" : 6219, "clientip" : "223.87.60.27", "extension" : "deb", "geo" : { "srcdest" : "IN:US", "src" : "IN", "dest" : "US", "coordinates" : { "lat" : 39.41042861, "lon" : -88.8454325 } }, "host" : "artifacts.elastic.co", "index" : "kibana_sample_data_logs", "ip" : "223.87.60.27", "machine" : { "ram" : 8589934592, "os" : "win 8" }, "memory" : null, "message" : "223.87.60.27 - - [2018-07-22T00:39:02.912Z] \"GET /elasticsearch/elasticsearch-6.3.2.deb_1 HTTP/1.1\" 200 6219 \"-\" \"Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1\"", "phpmemory" : null, "referer" : "http://twitter.com/success/wendy-lawrence", "request" : "/elasticsearch/elasticsearch-6.3.2.deb", "response" : 200, "tags" : [ "success", "info" ], "timestamp" : "2020-11-22T00:39:02.912Z", "url" : "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.deb_1", "utc_time" : "2020-11-22T00:39:02.912Z", "event" : { "dataset" : "sample_web_logs" } } }, ★以下9件については割愛 ] } }
サンプルデータとしてkibana_sample_data_logs
インデックスに登録されたドキュメントが取得できていますね。
次に条件を指定してみましょう。Elasticsearchでは検索条件を指定する場合にQuery DSLと呼ばれるJSONベースのクエリ言語を用います。
ip
フィールドが175.187.90.174
であるドキュメントを検索したい場合は以下のように指定を行います。
curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/kibana_sample_data_logs/_search?pretty&size=1" -H 'Content-Type: application/json' -d' { "query": { "term": { "ip": { "value": "175.187.90.174" } } } }'
複数条件で、response
フィールドが200
かつagent
フィールドにWindows
が含まれているドキュメントを検索したい場合は以下のように指定を行います。
$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/kibana_sample_data_logs/_search?pretty&size=1" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "term": { "response": { "value": 200 } } }, { "match": { "agent": "Windows" } } ] } } }' { "took" : 10, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3674, "relation" : "eq" }, "max_score" : 1.3600241, "hits" : [ { "_index" : "kibana_sample_data_logs", "_type" : "_doc", "_id" : "-vhuFXYBlzqvYqwIWQNp", "_score" : 1.3600241, "_source" : { "agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)", "bytes" : 14113, "clientip" : "99.74.118.237", "extension" : "deb", "geo" : { "srcdest" : "LK:IN", "src" : "LK", "dest" : "IN", "coordinates" : { "lat" : 48.31140472, "lon" : -114.2550694 } }, "host" : "artifacts.elastic.co", "index" : "kibana_sample_data_logs", "ip" : "99.74.118.237", "machine" : { "ram" : 11811160064, "os" : "ios" }, "memory" : null, "message" : "99.74.118.237 - - [2018-07-22T03:34:43.399Z] \"GET /beats/metricbeat/metricbeat-6.3.2-amd64.deb_1 HTTP/1.1\" 200 14113 \"-\" \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)\"", "phpmemory" : null, "referer" : "http://www.elastic-elastic-elastic.com/success/charles-camarda", "request" : "/beats/metricbeat/metricbeat-6.3.2-amd64.deb", "response" : 200, "tags" : [ "success", "info" ], "timestamp" : "2020-11-22T03:34:43.399Z", "url" : "https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-6.3.2-amd64.deb_1", "utc_time" : "2020-11-22T03:34:43.399Z", "event" : { "dataset" : "sample_web_logs" } } } ] } }
このようにElasticsearchでは、Query DSLを用いて検索条件を指定することで様々な検索を行うことができます。
おわりに
Elasticsearchには他にも様々なAPIが存在しますが、今回はElasticsearchの立ち上げ、サンプルデータの登録、簡単な検索について紹介しました。 Elasticsearchを用いてどのようにデータを検索するのかがすこし掴めたのではないかと思います。
この記事でElastic Stackを触ったことがないという方が少しでも興味を持っていただければ幸いです。
以上になります。ドキュメントは英語で機能も膨大ですがみなさんも是非触ってみてください。